package com.hnit.care.controller;

import com.hnit.care.entity.Coredata;
import com.hnit.care.entity.Result;
import com.hnit.care.entity.Weather;
import com.hnit.care.entity.vo.AppData;
import com.hnit.care.netty.NettyServerHandler;
import com.hnit.care.service.ICoredataService;
import com.hnit.care.service.SmsService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author KingGigi
 * @since 2023-09-02
 */
@Slf4j
@RestController
@CrossOrigin
public class CoredataController {

    @Autowired
    NettyServerHandler nettyServerHander;
    @Resource
    private ICoredataService CoredataService;
    @Resource
    private SmsService smsService;

    /**
     * 老师要求要提供restful接口给app
     * 那就给两套方案叭，
     * 一套采用技能赛netty传输数据，其实这套方案的数据是实时的
     * 另一套采用restful接口提供数据，这个需要做长轮询去监听，
     * 不过是app端的事情，我们不管
     * 我们将硬件传过来的数据存到数据库，然后提供接口就ok
     * 下面开始吧
     */

    /**
     * 查询核心数据封装到List里面
     * app需要什么数据，直接去List里去拿就好啦
     * @return
     */
    @GetMapping("getCoredata")
    public Result getCoredata(){
        log.info("查询核心数据");
        List<Coredata> Coredata = CoredataService.getCoredataList();
        return Result.success(Coredata);
    }

    /**
     * 接收app端的数据
     * 比如时间，开关状态，所吃药物类型等等
     * 将拿到的数据封装到一个vo里面，这样的话不管app传什么，我们接收的时候只需要
     * 在vo里面增加字段就好了
     * 其实还有一种方法，就是通过反射去获取，然后和字段做映射，这样的话app传过来的数据
     * 不管怎么变，后端的代码不用动
     * 太复杂，这里就从简
     */
    @PostMapping("/manageAppData")
    public void handleAppData(@Validated @RequestBody AppData appData){
        CoredataService.manageAppData(appData);
    }

    /**
     * 老人摔倒发送短信功能，这里我们引入腾讯云短信
     * 测试ok
     */
    @PostMapping("/sendSms/{phone}")
    public Result sendSms(@PathVariable String phone){
        /**
         * 这里是有问题的，腾讯云短信使用的时候是要设置参数的呀
         * 看源码：setTemplateParamSet(String[] TemplateParamSet)
         * 所以这个params是一定需要的
         * 我们在申请模板的时候要注意
         * 在项目中，直接参数为空字符串就ok了
         */
        // 验证码
        String code = "";
        // 过期时间
        String expireTime = "";
        // param中code表示验证码,expire_at代表过期时间
        String[] params = {code, expireTime};

        boolean isSend = smsService.sendSms("86" + phone, params);
        if (isSend) {
            return Result.success();
        } else {
            return Result.error("发送短信失败");
        }
    }
    /**
     * 获取天气、温度、最高气温、最低气温等信息
     * 测试ok
     */
    @GetMapping("/getWeatherInfo")
    public Result getWeatherInfo(){
        List<Weather> list = CoredataService.getInfo();
        return list != null ?
                Result.success(list) : Result.error("获取天气数据失败");
     }

    /**
     * 需要将陀螺仪的数据提供给老师那边
     * 老师那边可能需要这个接口
     */
    @GetMapping("/getGyroscopeInfo")
    public Result getGyroscopeInfo(){
        List<Coredata> list = CoredataService.getGyInfo();
        return list != null ?
                Result.success(list) : Result.error("获取陀螺仪数据失败");
    }

    /**
     *
     */
}
